package dao.implementations.postgresql.Administrador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.DBBase;
import dao.interfaces.Administrador.IProyecto;
import dao.transferObjects.UsuarioTO;
import dao.transferObjects.Administrador.ProyectoTO;
import dao.transferObjects.Socio.SocioTO;

public class ProyectoDB extends DBBase implements IProyecto {
	
	public ProyectoDB(Connection connection){
		this.conn = connection;
	}
	
	private static String CAMPOS_PROYECTO_INSERT = " id_proyecto, nombre_proyecto, rut_admin, descripcion, "+
		            							   " area, carrerra, dia_creacion, mes_creacion, anio_creacion, fecha_creacion, "+ 
		            							   " fecha_modificacion, comentario_docente, comentario_socio, comentario_alumno, eliminado ";
	
	private static String CAMPOS_PROYECTO = " id_proyecto, nombre_proyecto, rut_socio, rut_admin, descripcion, "+
       									   " area, carrerra, dia_creacion, mes_creacion, anio_creacion, fecha_creacion, "+ 
       									   " fecha_modificacion, comentario_docente, comentario_socio, comentario_alumno, eliminado";
	
	private ProyectoTO rsAproyectoTO(ResultSet rs)
	{
		ProyectoTO proyecto = new ProyectoTO();
		
		try
		{
			proyecto.setId_proyecto(rs.getInt("id_proyecto"));
			proyecto.setNombre_proyecto(rs.getString("nombre_proyecto"));
			proyecto.setRut_socio(rs.getInt("rut_socio"));
			proyecto.setRut_admin(rs.getInt("rut_admin"));
			proyecto.setDescripcion(rs.getString("descripcion"));
			proyecto.setArea(rs.getString("area"));
			proyecto.setCarrera(rs.getString("carrerra"));
			proyecto.setDia_creacion(rs.getString("dia_creacion"));
			proyecto.setMes_creacion(rs.getString("mes_creacion"));
			proyecto.setAnio_creacion(rs.getString("anio_creacion"));
			proyecto.setFecha_creacion(rs.getDate("fecha_creacion"));
			proyecto.setFecha_modificacion(rs.getDate("fecha_modificacion"));
			proyecto.setComentario_docente(rs.getString("comentario_docente"));
			proyecto.setComentario_socio(rs.getString("comentario_socio"));
			proyecto.setComentario_alumno(rs.getString("comentario_alumno"));
			proyecto.setEliminado(rs.getBoolean("eliminado"));
		}
		catch (SQLException e){
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> rsAproyectoTO : " + e.getMessage());
		}
		return proyecto;
	}
	
	public int obtenerSgteIDProyecto()
	{
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		int resp = -1;
		String query = "SELECT nextval('proyecto_id_proyecto_seq') as NEXTVAL";
		
		try
		{						
			pstmt = conn.prepareStatement(query);
						
			rs = pstmt.executeQuery();
			
			if(rs.next())
				resp = rs.getInt("NEXTVAL");
			
			pstmt.close();
			rs.close();
			
		}
		catch (SQLException sqle) {
			System.out.print("Error en ProyectoDB -> obtenerSgteIDProyecto() : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}		
		return resp;
	}
	
	@Override
	public int guardarProyecto(ProyectoTO proyecto) {
		 
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = "INSERT INTO proyecto( "+ CAMPOS_PROYECTO_INSERT +" ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
		
		try{
			pstm = this.conn.prepareStatement(query);
			long lCreacion = proyecto.getFecha_creacion().getTime();
			Timestamp tsCreacion = new Timestamp(lCreacion);
			System.out.println("tsCreacion: --> "+tsCreacion);
			long lModificacion = proyecto.getFecha_creacion().getTime();
			Timestamp tsModificacion = new Timestamp(lModificacion);
			System.out.println("tsModificacion: --> "+tsModificacion);
			
			pstm.setInt(1, obtenerSgteIDProyecto());
			pstm.setString(2, proyecto.getNombre_proyecto());
			pstm.setInt(3, proyecto.getRut_admin());
			pstm.setString(4, proyecto.getDescripcion()); 
			pstm.setString(5, proyecto.getArea());
			pstm.setString(6, proyecto.getCarrera());
			pstm.setString(7, proyecto.getDia_creacion());
			pstm.setString(8, proyecto.getMes_creacion());
			pstm.setString(9, proyecto.getAnio_creacion());
			pstm.setTimestamp(10, tsCreacion);
			pstm.setTimestamp(11, tsModificacion);
			pstm.setString(12, proyecto.getComentario_docente());
			pstm.setString(13, proyecto.getComentario_socio());
			pstm.setString(14, proyecto.getComentario_alumno());
			pstm.setBoolean(15, proyecto.getEliminado());
			result = pstm.executeUpdate();
			
			pstm.close();
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> guardarProyecto -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int modificarProyecto(ProyectoTO proyecto) {
		 
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = " UPDATE proyecto "+
		   			   " SET nombre_proyecto=?, rut_admin=?, descripcion=?, area=?, carrerra=?, "+
				       " fecha_modificacion=?, eliminado=? "+
				       " WHERE id_proyecto=?; ";
		
		try{
			pstm = this.conn.prepareStatement(query);
			
			java.util.Date a = new java.util.Date();
			long lnMilisegundos = a.getTime();
			Timestamp ts = new Timestamp(lnMilisegundos);
			System.out.println("tsModificacion: --> "+ts);
			
			pstm.setString(1, proyecto.getNombre_proyecto());
			pstm.setInt(2, proyecto.getRut_admin());
			pstm.setString(3, proyecto.getDescripcion());
			pstm.setString(4, proyecto.getArea());
			pstm.setString(5, proyecto.getCarrera());
			pstm.setTimestamp(6, ts);
			pstm.setBoolean(7, proyecto.getEliminado());
			pstm.setInt(8, proyecto.getId_proyecto());
			
			result = pstm.executeUpdate();
			
			pstm.close();
			
			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> modificarProyecto -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public int eliminarProyecto(ProyectoTO proyecto) {
		PreparedStatement pstm = null;
		int result = 0;
		
		String  query = " DELETE FROM proyecto " +
        				" WHERE id_proyecto = ?";
		
		try{
			System.out.println("Entra try delete proyectop");
			pstm = this.conn.prepareStatement(query);
			
			pstm.setInt(1, proyecto.getId_proyecto());
			
			result = pstm.executeUpdate();
			
			pstm.close();

		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> eliminarProyecto -> "+ ex.getMessage());
		}		
		return result;
	}

	@Override
	public ProyectoTO obtenerProyecto(int id_proyecto) {
		 
		ProyectoTO proyecto = new ProyectoTO();
		PreparedStatement pstmt = null;		
		ResultSet rs = null;		
		String query = "SELECT "+CAMPOS_PROYECTO+" FROM proyecto WHERE id_proyecto=?";		
		
		try
		{
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, id_proyecto);
			rs = pstmt.executeQuery();
			
			if(rs.next()){				
				proyecto = rsAproyectoTO(rs);
			}
			rs.close();
			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerProyecto : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		return proyecto;
	}

	@Override
	public List<ProyectoTO> obtenerTodosProyectos() {
		 
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		PreparedStatement pstmt = null;		
		ResultSet rs = null;		
		String query = "SELECT "+CAMPOS_PROYECTO+" FROM proyecto";		
		
		try
		{
			pstmt = conn.prepareStatement(query);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				listaProyectos.add(this.rsAproyectoTO(rs));
			}
			rs.close();
			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerTodosProyectos : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		return listaProyectos;
	}
	
	@Override
	public List<ProyectoTO> obtenerProyectosAsignados(){
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		PreparedStatement pstmt = null;		
		ResultSet rs = null;		
		String query = " SELECT "+CAMPOS_PROYECTO+" FROM proyecto WHERE rut_socio IS NOT NULL ";		
		
		try
		{
			pstmt = conn.prepareStatement(query);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				listaProyectos.add(this.rsAproyectoTO(rs));
			}
			rs.close();
			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerProyectosAsignados : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		return listaProyectos;
	}
	
	@Override
	public List<ProyectoTO> obtenerProyectosNoAsignados(){
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		PreparedStatement pstmt = null;		
		ResultSet rs = null;		
		String query = " SELECT "+CAMPOS_PROYECTO+" FROM proyecto WHERE rut_socio IS NULL ";		
		
		try
		{
			pstmt = conn.prepareStatement(query);			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				listaProyectos.add(this.rsAproyectoTO(rs));
			}
			rs.close();
			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerProyectosNoAsignados : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		return listaProyectos;
	}
	
	public List<ProyectoTO> obtenerProyectosAsignadosSocio(SocioTO socio)
	{
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		PreparedStatement pstmt = null;		
		ResultSet rs = null;		
		String query = " SELECT "+CAMPOS_PROYECTO+" FROM proyecto WHERE rut_socio=? ";		
		
		try
		{
			pstmt = conn.prepareStatement(query);
			
			pstmt.setInt(1, socio.getRut_socio());
			
			rs = pstmt.executeQuery();
			while(rs.next()){				
				listaProyectos.add(this.rsAproyectoTO(rs));
			}
			rs.close();
			pstmt.close();
		}
		catch (SQLException sqle) {
			System.out.println("Error en "+this.getClass().getCanonicalName()+" -> obtenerProyectosAsignadosSocio : " + sqle.getMessage());
		}
		finally{
			if (pstmt != null) {
		          try {
		               pstmt.close();
		               
		          } catch (SQLException e) {
		               e.printStackTrace();
		          }
			}
		}
		return listaProyectos;
	}

	@Override
	public List<ProyectoTO> obtenerTodosProyectosReducido() {
		
		return null;
	}

	@Override
	public int asignarProyectoSocio(ProyectoTO proyecto, SocioTO socio){
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = " UPDATE proyecto "+
		   			   " SET rut_socio=? "+
				       " WHERE id_proyecto=?; ";
		
		try{
			pstm = this.conn.prepareStatement(query);
			
			pstm.setInt(1, socio.getRut_socio());
			pstm.setInt(2, proyecto.getId_proyecto());
			
			result = pstm.executeUpdate();
			
			pstm.close();
			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> asignarProyectoSocio -> "+ ex.getMessage());
		}		
		return result;
	}
	
	@Override
	public int desAsignarProyectoSocio(ProyectoTO proyecto, SocioTO socio){
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = " UPDATE proyecto "+
		   			   " SET rut_socio=? "+
				       " WHERE id_proyecto=? AND rut_socio=?; ";
		
		try{
			pstm = this.conn.prepareStatement(query);
			
			pstm.setNull(1, java.sql.Types.INTEGER);
			pstm.setInt(2, proyecto.getId_proyecto());
			pstm.setInt(3, proyecto.getRut_socio());
			
			result = pstm.executeUpdate();
			
			pstm.close();
			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> desAsignarProyectoSocio -> "+ ex.getMessage());
		}		
		return result;
	}
	
	@Override
	public int desAsignarTODOSProyectoSocio(int rut){
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = " UPDATE proyecto "+
		   			   " SET rut_socio=? "+
				       " WHERE rut_socio=?; ";
		
		try{
			pstm = this.conn.prepareStatement(query);
			
			pstm.setNull(1, java.sql.Types.INTEGER);
			pstm.setInt(2, rut);
			
			result = pstm.executeUpdate();
			
			pstm.close();
			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> desAsignarTODOSProyectoSocio -> "+ ex.getMessage());
		}		
		return result;
	}
	
	@Override
	public int desAsignarProyectoAdmin(UsuarioTO usuario){
		PreparedStatement pstm = null;
		int result = 0;
		
		String query = " UPDATE proyecto "+
		   			   " SET rut_admin=? "+
				       " WHERE rut_admin=?; ";
		
		try{
			pstm = this.conn.prepareStatement(query);
			
			pstm.setNull(1, java.sql.Types.INTEGER);
			pstm.setInt(2, usuario.getRut());
			
			result = pstm.executeUpdate();
			
			pstm.close();
			
		}
		catch (SQLException ex)
		{
			System.out.println("Error en la clase ProyectoDB -> desAsignarProyectoAdmin -> "+ ex.getMessage());
		}		
		return result;
	}
	
}
